package com.ctc;

public interface CTCEvent
{
    /**
     * 设备事件接口
     */
    interface IDevice
    {

        /**
         * 连接状态变化事件
         *
         * @param player P位
         * @param state  连接状态
         */
        void onConnectStateChange(byte player, CTCClientConnState state);

        /**
         * 发送成功事件
         *
         * @param player P位
         * @param inst   指令
         * @param data   数据
         */
        void onSendSuccess(byte player, byte[] inst, byte[] data);

        /**
         * 发送失败事件
         *
         * @param player P位
         * @param state  状态
         * @param inst   指令
         * @param data   数据
         */
        void onSendFail(byte state, byte player, byte[] inst, byte[] data);

        /**
         * 串口打开事件
         *
         * @param player P位
         * @param msg    成功返回null，失败返回错误信息
         */
        void onSerialOpen(byte player, String msg);

        /**
         * 串口关闭事件
         *
         * @param player P位
         * @param msg    成功返回null，失败返回错误信息
         */

        void onSerialClose(byte player, String msg);

        /**
         * 串口调试日志事件
         *
         * @param player P位
         * @param msg    日志信息
         */

        void debugLogE(byte player, String msg);

        /**
         * 串口调试日志事件
         *
         * @param player P位
         * @param msg    日志信息
         */

        void debugLogI(byte player, String msg);
    }

    /**
     * 主设备事件接口
     */
    interface IMaster extends IDevice
    {
        /**
         * 从设备状态改变事件
         *
         * @param player P位
         * @param data   是否允许消费	1字节	0=卡头可正常消费,1=卡头不可进行消费<br>
         *               游戏机故障码	2字节	0=无故障,非0代表有故障<br>
         */
        void onSlaveStateChange(byte player, byte[] data);

        /**
         * 抄表回应事件
         *
         * @param player P位
         * @param data   5个byte为一组,一共10组50个byte<br>
         *               0:类型<br>
         *               1-4:数据<br>
         *               类型<br>
         *               0=投币总数,1=电子币总数,2=实物币总数<br>
         *               10=出票总数,11=出电子票总数,12=出实物票总数<br>
         *               20=出蓝票总数,21=出电子蓝票总数,22=出实物蓝票总数<br>
         *               30=总出卡片数<br>
         *               100=出礼品1总数,101=出实物礼品2总数,102=出实物礼品2总数,103=出实物礼品4总数,104=出实物礼品5总数,...130=出实物礼品31总数<br>
         *               255=数据结束(无效后面不能再放有效数据)<br>
         */
        void onMeterData(byte player, byte[] data);

        /**
         * 实体数据(实物币,实物票)上报事件
         *
         * @param player P位
         * @param data   实物类型	1字节	0=实物币,2=实物彩票,2=实体蓝票,3=实体卡片,100=实物礼品1,101=实物礼品2...130=实物礼品31<br>
         *               奖励数量	4字节	上报数量<br>
         */
        void onPhysicalReport(byte player, byte[] data);

        /**
         * 查询每局投币回应事件
         *
         * @param player P位
         * @param data   每局币数	2字节	每局游戏需要的投币数(投币器的脉冲数)
         */
        void onQueryCoin(byte player, byte[] data);

        /**
         * 氛围事件
         *
         * @param player P位
         * @param data   事件等级	2字节	0开始,数字越大氛围越强烈<br>
         *               将要奖励类型	1字节	0=奖励彩票,1=奖励蓝票,10=游戏任务得分,100=奖励实物<br>
         *               将要奖励数量	4字节	产生的奖励相关的数量<br>
         */
        void onAtmosphere(byte player, byte[] data);

        /**
         * 握手成功事件
         *
         * @param player P位
         * @param data   产品ID	4字节	CTC官网分配的产品ID,用于查询是哪个厂家出的什么产品<br>
         *               设备ID	16字节	每个设备自己保证全球唯一<br>
         *               支持的CTC协议最高版本	2字节	本设备支持的CTC协议最高版本<br>
         */
        void onHandshake(byte player, byte[] data);

        /**
         * 卡头投币回应事件
         *
         * @param player P位
         * @param data   投币结果	1字节	0=成功接收,1=拒绝接收<br>
         *               消费记录ID	16字节	投币时传递的交易ID<br>
         *               消费记录ID	16字节	标识此笔交易的ID<br>
         */
        void onCoinInRsp(byte player, byte[] data);

        /**
         * 游戏有奖励给玩家(游戏机到卡头)
         *
         * @param player P位
         * @param data   奖励类型	1字节	0=奖励彩票,1=奖励蓝票,10=游戏任务得分<br>
         *               奖励数量	4字节	奖励的数量<br>
         */
        void onReward(byte player, byte[] data);
    }

    /**
     * 从设备事件接口
     */
    interface ISlave extends IDevice
    {
        /**
         * 从设备状态改变事件
         *
         * @param player P位
         * @param data   卡头可用状态	1字节	0=正常可用,1=等待配网,2=连接门店服务异常,3=网络无法连接,4=正在联网
         */
        void onMasterStateChange(byte player, byte[] data);

        /**
         * 抄表
         *
         * @param player P位
         */
        void onMeterRead(byte player);

        /**
         * 查询每局投币
         *
         * @param player P位
         */
        void onQueryCoin(byte player);

        /**
         * 卡头投币事件
         *
         * @param player P位
         * @param data   投币数量	4字节	投币数量<br>
         *               会员ID	16字节	同一张会员卡或同一个会员账户时ID相同<br>
         *               消费记录ID	16字节	标识此笔交易的ID<br>
         */
        void onCoinIn(byte player, byte[] data);

        /**
         * 握手
         *
         * @param player P位
         * @param data   产品ID	4字节	CTC官网分配的产品ID,用于查询是哪个厂家出的什么产品<br>
         *               设备ID	16字节	每个设备自己保证全球唯一<br>
         *               支持的CTC协议最高版本	2字节	本设备支持的CTC协议最高版本<br>
         */
        void onHandshake(byte player, byte[] data);

        /**
         * 设置投币金额
         *
         * @param player P位
         * @param data   每局币数	2字节	每局游戏需要的投币数(投币器的脉冲数)
         */
        void onSetCoinPrice(byte player, byte[] data);

        /**
         * 选择通道
         *
         * @param player P位
         * @param data   彩票通道	1字节	0=实物,1=电子,2=暂时不出<br>
         *               蓝票通道	1字节	0=实物,1=电子,2=暂时不出<br>
         */
        void onSelectChannel(byte player, byte[] data);
    }

}